package com.xwli.javase.example;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @program: springcloud
 * @description:
 * @author: xwli
 * @create: 2022-03-12 17:47
 **/
public class WaitNotifyExample {

    /**
    * @description:
     * 调用 wait() 使得线程等待某个条件满足，线程在等待时会被挂起，
     * 当其他线程的运行使得这个条件满足时，其它线程会调用 notify() 或者 notifyAll() 来唤醒挂起的线程。
    * @params: []
    * @return: void
    * @author: xwli
    * @date: 2022/3/12 17:48
    */
    public synchronized void before() {
        System.out.println("before");
        notifyAll();
    }

    /**
    * @description:
     * 使用 wait() 挂起期间，线程会释放锁。这是因为，
     * 如果没有释放锁，那么其它线程就无法进入对象的同步方法或者同步控制块中，
     * 那么就无法执行 notify() 或者 notifyAll() 来唤醒挂起的线程，造成死锁。
    * @params: []
    * @return: void
    * @author: xwli
    * @date: 2022/3/12 17:48
    */
    public synchronized void after() {
        try {
            wait();
            //Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("after");
    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        WaitNotifyExample example = new WaitNotifyExample();
        executorService.execute(() -> example.after());
        executorService.execute(() -> example.before());
        executorService.shutdown();
    }
}
